function [result] = main_gauss_pivot(A, b)

  result = retrossub( triangulariza_pivot(A, b) )
endfunction

// triangulariza
// A - matriz de coeficientes do sistema linear
// b - vetor de termos independentes
// retorno - matriz extendida triangular superior
function [result] = triangulariza_pivot(A, b)

  //Verifica se a matriz tem as dimensoes corretas
  if size(A,'r') <> size(A,'c') | size(b,'c') <> 1 | size(b,'r') <> size(A,'r')
    result = "A matriz inserida e invalida";
    return;
  end

  //Verifica se o problema tem solucao
  if det(A) == 0,
    result = "A determinante da matriz dos coeficientes e igual a zero";
    return;
  end

  //Matriz extendida
  result = [A b];
  
  n = size(result,'r');
  
  disp("Iniciando processo de triangularizacao");
  
  disp("Matriz inicial:")
  
  disp(result);
  
  disp("Calculos:")
  
  //Executando o metodo
  for k = 1:n-1,

    //seleciona o pivo inicial
    pivo = abs( result(k,k) );
    linha = k;

    //identificando maior valor absoluto da coluna (abaixo da diagonal principal)
    for i = k+1:n,
        vabs = abs( result(i,k) );
        if pivo < vabs
            pivo = vabs;
            linha = i;
        end
    end

    //caso 0 seja o unico valor, entao o sistema nao possui solucao por este metodo
    if pivo == 0
        result = "Sistema sem solucao";
        return;
    end

    //caso haja uma linha de maior valor absoluto que a diagonal, troca as linhas
    if linha > k
        disp("Troca de linha:");
        tmp = result(k,:);
        result(k,:) = result(linha,:);
        result(linha,:) = tmp;
        disp(result);
    end

    //Zera os elementos abaixo da diagonal principal
    for i = k+1:n,
        m = result(i,k)/result(k,k);
        result(i, :) = result(i, :)  - result(k,:) .* m;
    end
    disp(result);
  end
  disp("Triangularizacao finalizada")
endfunction

// triangulariza
// A - matriz extendida triangular superior
// retorno - vetor de coeficientes resultante
function [result] = retrossub(A)
  //Verifica se a funcao de triangularizacao retornou um erro
  if typeof(A) == "string"
    result = A;
    return;
  end
  [l c] = size(A);
  result(l) = A(l,c)/A(l,l);
  i = l - 1;
  
  //Retrossubstituicao
  while i >= 1,
    result(i) = ( A(i,c ) - sum( A(i,i+1:l) .* result(i+1:l)' ) ) / A(i,i);
    i=i-1;
  end
endfunction